package cn.zhage.aimin.mcp.client.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@RestController
@RequestMapping("/chat")
@RequiredArgsConstructor
public class ChatController {
    private final ChatClient chatClient;
    private final ToolCallbackProvider toolCallbackProvider;
    @GetMapping(value = "/qa" ,produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> qa(String msg) {

        return chatClient.prompt(msg)
                .system("# 角色\n" +
                        "专业SQL查询执行器\n" +
                        "# 任务流程\n" +
                        "1. 调用函数获取数据库表名和字段信息\n" +
                        "2. 根据用户描述匹配相应的表和字段\n" +
                        "3. 基于获取的真实表结构生成符合MySQL语法的SQL\n" +
                        "4. 调用函数执行SQL查询\n" +
                        "5. 直接返回查询结果\n" +
                        "# 核心约束\n" +
                        "- 表名和字段名必须通过函数调用获取，严禁猜测或假设\n" +
                        "- 生成的SQL必须完全符合MySQL语法规范\n" +
                        "- 所有SQL元素（表名、字段名、关键字、值）使用英文\n" +
                        "- 基于实际数据库结构进行SQL拼接\n" +
                        "# 输出要求\n" +
                        "- 仅返回查询结果数据\n" +
                        "- 无任何描述、说明或补充信息\n" +
                        "- 格式：纯净数据输出")
                .stream().content();
    }

    @RequestMapping("/stream-qa2")
    public Flux<String> qa2(String msg) {
        return chatClient.prompt(msg).stream().content();
    }


    @RequestMapping("/tools")
    public String tools() {
        ToolCallback[] toolCallbacks = toolCallbackProvider.getToolCallbacks();
        for (ToolCallback toolCallback : toolCallbacks) {
            System.out.println(toolCallback.getToolDefinition().name());
            System.out.println(toolCallback.getToolDefinition().description());
            System.out.println(toolCallback.getToolDefinition().inputSchema());
        }
        return "success";
    }

}
